package exercise02;

/**
 * @author shkstart
 * @date 2022/4/23 - 17:39
 */

// 这里是对ArrayExercise.java的改进
public class ArrayExercise01 {
    public static void main(String[] args) {
        Student1[] stus = new Student1[20];
        //String[] arr = new String[10]; 其实String也算是个对象数组
        //只是我们习惯了，Student也一样。数组的元素可以是任何数据类型
        //也包括我们自定义的类Student
        for(int i = 0; i < stus.length; i++) {
            stus[i] = new Student1();
            stus[i].number = i + 1;
            stus[i].score = (int)(Math.random()* (100 -0 + 1) + 0);
            stus[i].state = (int)(Math.random()* (6 - 1 + 1) + 1);
//            if(stus[i].state == 3) {
//                System.out.println( stus[i].state +" " + stus[i].number + " " + stus[i].score  );
//            }//我的做法是把if直接放在首次for循环对象属性赋值中去遍历,其实差不多。
        }
        ArrayExercise01 test = new ArrayExercise01();
        //注：不管要调用什么方法，都应该定义方法所在的类中的对象，才可以调用

        //遍历学生数组
        test.print(stus);
        System.out.println("********************");
        //问题一：打印出3年级(state值为5）的学生信息。
        test.searchState(stus,5);
        System.out.println("*******************************");
        //问题二：使用冒泡排序按学生成绩排序，并遍历所有学生信息
        test.sort(stus);

        //遍历学生数组
        test.print(stus);


// 此节感悟：
        /* 1.需谨记在类中定义一个方法时，方法中的变量为局部变量。是新定义的，
             即使与全局变量类型变量名相同，也不冲突。
           2.在想要调用方法时，记住需定义对象。调用方法中有形参时，最好定义
             变量类型变量名与类中的全局变量相同，因为可以易懂。
           3.在排序二维数组时，如若需要交换它们的小部分如：数字大小，或者名称等等的序列。
             需交换一维数组的地址，然后再遍历。
        * */



    }
//    遍历Student1[]数组的操作
    public void print(Student1[] stus) {
        for(int i = 0; i < stus.length; i++ ) {
            System.out.println(stus[i].info());
        }
    }
//   查找Stduent1数组中指定年级的学生信息
    public void searchState(Student1[] stus,int state) {
        for(int i = 0;i <stus.length;i++){
            if(stus[i].state == state){ //注：这里的state可以查询1到6年级的信息
                System.out.println(stus[i].info());
            }
        }
    }
//    给Student1数组排序
public void sort(Student1[] stus){
    for(int i = 0;i < stus.length - 1;i++){
        for(int j = 0;j < stus.length - 1 - i;j++){
            if(stus[j].score > stus[j + 1].score){
                //如果需要换序，交换的是数组的元素：Student对象！！！
                Student1 temp = stus[j];
                stus[j] = stus[j + 1];
                stus[j + 1] = temp;

//                int temp = stus[j].score;
//                stus[j].score = stus[j + 1].score;  //我自己最初交换成绩的思路
//                stus[j + 1].score = temp;
            }
        }
    }
}
}

class Student1{
    int number;
    int state;
    int score;

    //造方法，老师遍历对象数组做法
    public String info() {
        return "学号 " + number + "，年极" + state + ",成绩" + score;
    }
}



